package com.itjh.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.itjh.pojo.MyResponseResult;
import com.itjh.utils.JwtUtils;
import com.itjh.utils.ThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * Description:自定义拦截器
 *
 * @Create 2025/1/21 12:49
 */

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Autowired
    private JwtUtils jwtUtils;
    @Override
    //目标资源方法(比如controller中的方法)执行前执行。 返回true：放行    返回false：不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //2: 根据请求头 Token 获取令牌
        String token = request.getHeader("token");
        //3: 校验令牌是否合法,如果合法则放行
        Map<String, Object> map = jwtUtils.parseJwt(token);
        if (map == null){
            //说明令牌过期了或不合法，直接响应一个错误信息即可
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            // 把result响应给前端(需要把对象转json) 由于目前代码还没有执行controller,因此需要我们自己手动转成json,并手动响应数据
            //把MyResponseResult对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String jsonString = JSONObject.toJSONString(result);
            response.getWriter().write(jsonString);
            return false;
        }
        // 合法的情况  先使用ThreadLocal  本地线程保存一个变量,以便于后续使用
        ThreadLocalUtils.setValue(map);
        return true;
    }
}
